/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.viajaconmigo.repository.jpa;

import com.viajaconmigo.repository.PropuestaDAO;
import com.viajaconmigo.model.Pais;
import com.viajaconmigo.model.PlanEco;
import com.viajaconmigo.model.PlanOcio;
import com.viajaconmigo.model.Propuesta;
import com.viajaconmigo.model.Usuario;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import javax.inject.Named;
import javax.persistence.Query;

/**
 *
 * @author Pablo
 */
@Named
public class PropuestaDAOJPA extends GenericoDAOJPA<Propuesta> implements PropuestaDAO {

    @Override
    public ArrayList<Propuesta> findPropuesta(Pais paisDestino, Date fechaIni,
            Date fechaFin, Short nDiasMax, Short nDiasMin, PlanEco planEco,
            PlanOcio planOcio) {
        /*
         String consulta3 ="SELECT p FROM Propuesta p "
         + "join p.propuestadestinosList d "
         + "join p.propuestafechasList f "
         + "where d.idPais =:paisDestino "
         + "and f.fechaIni <:fechaFin and f.fechaFin >:fechaIni";
         */
        boolean and = false;
        String consulta = "SELECT distinct p FROM Propuesta p";
        if (paisDestino != null) {
            consulta = consulta + " join p.propuestasDestinos d";
        }
        if (fechaIni != null && fechaFin != null) {
            consulta = consulta + " join p.propuestasFechas f";
        }
        if (paisDestino != null || fechaIni != null || nDiasMax != null || planEco != null || planOcio != null) {
            consulta = consulta + " where";
        }
        if (paisDestino != null) {
            consulta = consulta + " d.pais =:paisDestino";
            and = true;
        }
        if (fechaIni != null && fechaFin != null) {
            if (and) {
                consulta = consulta + " and";
            }
            consulta = consulta + " f.fechaIni <:fechaFin and f.fechaFin >:fechaIni";
            and = true;
        }
        if (nDiasMax != null || nDiasMin != null) {
            if (and) {
                consulta = consulta + " and";
            }
            consulta = consulta + " p.diasMin <=:nDiasMax and p.diasMax >=:nDiasMin";
            and = true;
        }
        if (planEco != null) {
            if (and) {
                consulta = consulta + " and";
            }
            consulta = consulta + " p.planEco =:planEco";
            and = true;
        }
        if (planOcio != null) {
            if (and) {
                consulta = consulta + " and";
            }
            consulta = consulta + " p.planOcio =:planOcio";
        }
        Query query = em.createQuery(consulta);
        if (paisDestino != null) {
            query.setParameter("paisDestino", paisDestino);
        }
        if (fechaIni != null && fechaFin != null) {
            query.setParameter("fechaFin", fechaFin);
            query.setParameter("fechaIni", fechaIni);
        }
        if (nDiasMax != null || nDiasMin != null) {
            query.setParameter("nDiasMax", nDiasMax);
            query.setParameter("nDiasMin", nDiasMin);
        }
        if (planEco != null) {
            query.setParameter("planEco", planEco);
        }
        if (planOcio != null) {
            query.setParameter("planOcio", planOcio);
        }
        ArrayList<Propuesta> propuestas = new ArrayList<>(query.getResultList());
        return propuestas;
    }
    
    @Override
    public ArrayList<Propuesta> obtenerPropuestasPorMi(Usuario nick){
        String consulta = "SELECT distinct p FROM Propuesta p where p.nick=:nick"
                + " AND p.fechaCaduca>=:fecha";
        Date fecha_actual=Calendar.getInstance().getTime();
        Query query = em.createQuery(consulta);
        query.setParameter("nick",nick);
        query.setParameter("fecha",fecha_actual);
        ArrayList<Propuesta> propuestasPorMi = 
                new ArrayList<>(query.getResultList());
        return propuestasPorMi;
    }
    
    @Override
    public ArrayList<Propuesta> obtenerPropuestasPorOtros(Usuario nick){
        String consulta = "SELECT distinct p FROM Propuesta p join "
                + "p.propuestasEditor e where e.nick=:nick AND e.lider=0 "
                + "AND p.fechaCaduca>=:fecha";
        Query query = em.createQuery(consulta);
        query.setParameter("nick",nick);
        Date fecha_actual=Calendar.getInstance().getTime();
        query.setParameter("fecha",fecha_actual);
        ArrayList<Propuesta> propuestasPorOtros = 
                new ArrayList<>(query.getResultList());
        return propuestasPorOtros;
    }
    
    @Override
    public ArrayList<Propuesta> obtenerPropuestasPasadas(Usuario nick){
        String consulta = "SELECT distinct p FROM Propuesta p join "
                + "p.propuestasEditor e where e.nick=:nick "
                + "AND p.fechaCaduca<:fecha";
        Query query = em.createQuery(consulta);
        query.setParameter("nick",nick);
        Date fecha_actual=Calendar.getInstance().getTime();
        query.setParameter("fecha",fecha_actual);
        ArrayList<Propuesta> propuestasPasadas = 
                new ArrayList<>(query.getResultList());
        return propuestasPasadas;
    }
}
